﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Unimaq.FacturaDBS_Spring.LogicaNegocio.Version2.Spring
{
    public class CM_CO_Comprobante_InterfaseBLL
    {
        public void Cabecera_Detalle_Relacion(List<Entidades.Version2.Spring.CM_CO_Comprobante_Interfase> listCabecera, List<Entidades.Version2.Spring.CM_CO_ComprobanteDetalle_Interfase> listDetalle)
        {
            foreach (Entidades.Version2.Spring.CM_CO_Comprobante_Interfase c in listCabecera)
            {
                List<Entidades.Version2.Spring.CM_CO_ComprobanteDetalle_Interfase> query =
                    listDetalle.Where(
                        x => x.TipoComprobante == c.TipoComprobante &&
                            x.SerieComprobante == c.SerieComprobante &&
                            x.NumeroComprobante == c.NumeroComprobante).OrderBy(x => x.Linea).ToList();

                if (query.Count > 0)
                {
                    foreach (Entidades.Version2.Spring.CM_CO_ComprobanteDetalle_Interfase d in query)
                    {
                        c.ListaDetalle.Add(d);
                    }
                }
                else
                {
                    c.ErrorSistema = "E";
                }
            }
        }

        public void Cabecera_Detalle_AjustarMontos(List<Entidades.Version2.Spring.CM_CO_Comprobante_Interfase> listCabecera)
        {
            foreach (Entidades.Version2.Spring.CM_CO_Comprobante_Interfase c in listCabecera)
            {
                decimal sumMontoAfecto = c.ListaDetalle.Sum(x => x.MontoAfecto);
                decimal sumMontoImpuestoVentas = c.ListaDetalle.Sum(x => x.MontoImpuestoVentas);

                if (c.MontoAfecto != sumMontoAfecto)
                {
                    //calculamos la diferencia
                    decimal diferenciaMontoAfecto = c.MontoAfecto - sumMontoAfecto;
                    decimal beforeMontoAfecto = c.ListaDetalle.First(x => x.Linea == 1).MontoAfecto;
                    //ajustamos los montos
                    //sumamos/restamos la diferencia al ultimo elemento de la lista
                    c.ListaDetalle.First(x => x.Linea == 1).MontoAfecto = beforeMontoAfecto + diferenciaMontoAfecto;
                }

                if (c.MontoImpuestoVentas != sumMontoImpuestoVentas)
                {
                    //calculamos la diferencia
                    decimal diferenciaMontoImpuestos = c.MontoImpuestoVentas - sumMontoImpuestoVentas;
                    decimal beforeMontoImpuestoVentas = c.ListaDetalle.First(x => x.Linea == 1).MontoImpuestoVentas;

                    //ajustamos montos
                    //sumamos/restamos la diferencia al ultimo elemento de la lista
                    c.ListaDetalle.First(x => x.Linea == 1).MontoImpuestoVentas = beforeMontoImpuestoVentas + diferenciaMontoImpuestos;
                }
            }
        }

        public int Registrar(Util.ContextoDBSpring ctx, Entidades.Version2.Spring.CM_CO_Comprobante_Interfase cmCabecera)
        {
            ADO.Version2.Spring.Spring_CM_CO_Comprobante_Interfase_ADO comprobanteADO =
                new ADO.Version2.Spring.Spring_CM_CO_Comprobante_Interfase_ADO();

            int resultado = 0;
            resultado = comprobanteADO.Registrar(ctx, cmCabecera);

            return resultado;
        }

        public List<int> Registrar(List<Entidades.Version2.Spring.CM_CO_Comprobante_Interfase> listCabecera)
        {
            LogicaNegocio.Version2.Spring.CM_CO_ComprobanteDetalle_InterfaseBLL comprobanteDetalleBLL = new LogicaNegocio.Version2.Spring.CM_CO_ComprobanteDetalle_InterfaseBLL();
            LogicaNegocio.Version2.UNIMAQ_ProcesoCargaBLL unimaqProcesoCargaBLL = new LogicaNegocio.Version2.UNIMAQ_ProcesoCargaBLL();

            List<int> result = new List<int>();
            int result1 = 0;
            int result2 = 0;

            Entidades.Version2.Spring.UNIMAQ_ProcesoCarga selectedProcesoCarga = unimaqProcesoCargaBLL.Obtener(new Entidades.Version2.Spring.UNIMAQ_ProcesoCarga() { Compania = "06000000" });

            if (selectedProcesoCarga != null)
            {
                int result3 = 0;
                result3 = selectedProcesoCarga.Valor;

                using (Util.ContextoDBSpring ctx = Util.ContextoDBSpring.GetContexto())
                {
                    ctx.LoadTransaction();

                    foreach (Entidades.Version2.Spring.CM_CO_Comprobante_Interfase l in listCabecera)
                    {
                        l.ProcesoCarga = result3;
                        result1 += Registrar(ctx, l);

                        foreach (Entidades.Version2.Spring.CM_CO_ComprobanteDetalle_Interfase ld in l.ListaDetalle)
                        {
                            ld.ProcesoCarga = result3;
                            result2 += comprobanteDetalleBLL.Registrar(ctx, ld);
                        }
                    }

                    selectedProcesoCarga.Valor++;
                    unimaqProcesoCargaBLL.Actualizar(ctx, selectedProcesoCarga);

                    result.Add(result1);
                    result.Add(result2);
                    result.Add(result3);

                    ctx.ConfirmarTx();
                }
            }

            return result;
        }
    }
}
